package ru.ak239.kozyatinskiy.lecture1;

/**
 * Пример с исключениями
 */
public class ExceptionMain {
    /**
     * Все исключения в java наследуеются от Exception
     */
    class MyException extends Exception {
        /**
         * Это конструктор, он публичный и принимает строку в качестве параметра
         * @param msg текст сообщения
         */
        public MyException(String msg) {
            /**
             * Вызов конструктора базового класса
             * @task 5.1 Как вызвать конструктор базового класса в C#?
             */
            super(msg);
        }
    }


    /**
     * в классе можно определять собственные методы
     * @throws MyException класс исключения, которое бросается методом
     * директива throws означает, что этот класс можнт кинуть исключение
     *
     * @task 5.2 какими способами можно вызвать этот метод из другого кода с учетом директивы
     * throws (подсказка: метода два)
     */
    public void foo() throws MyException {
        System.out.println("Testing exceptions...");
        throw new MyException("Kernel panic!!!");
    }

    /**
     * Стандартный метод main
     * @param args набор аргументов командной строки
     */
    public static void main(String[] args) {
        try {
            /**
             * Создаем объект класса ExceptionMain
             * И дергаем метод foo, который генерирует исключение
             *
             * @task 5.3 можно ли вызвать метод foo не создавая объекта?
             */
            ExceptionMain t = new ExceptionMain();
            t.foo();

            // обрабатываем исключение
        } catch (MyException e) {
            /**
             * @task 5.4 Что делает метод printStackTrace?
             * @task 5.5 Что такое System.err?
              */
            e.printStackTrace(System.err);
        }
    }

}
